baselib.report(0x00, "TD4.5.3 beginning.")
-- 下面是初始化操作:
busilib.SetOrientation(1)              -- 设置USB的CC线,另一根则为Vconn线(这里设置CC1)
busilib.SetRpValue(1, 0)               -- 设置USB Source用于标识输出电流能力的电阻值,第二个参数写0代表500mA
-- 第一步:CVS transitions to Unattached.SRC
busilib.setUsbCcs(CCS.Unattached)     
busilib.setUsbRole(ROLE.Source)
-- 第二步:CVS waits 5ms
baselib.delay(5)
-- 第三步:For a PUT_R, CVS terminates one CC pin with Ra for the duration of the test, except when CVS is in Disabled
-- 对于PUT_R，CVS在测试期间将一个CC引脚设置为Ra，除了当CVS处于Disabled状态时
if PUT_R then
    busilib.SetSwitchState(SW.CC2_RA, 1)    -- 将CC2_RA开关打开
end
-- 第四步:CVS verifies:PUT attaches Rd within max dcSRC.DRP x max tDRP [TD.4.5.3.V.1] For a PUT_R, both CCs are terminated with Rd.
-- PUT 在 max dcSRC.DRP × max tDRP 内提供 Rd [TD.4.5.3.V.1]  对于 PUT_R，两个 CC 引脚都为 Rd
baselib.delay(70)                           -- 等待max dcSRC.DRP(0.7) x max tDRP(100ms)
--为第6步准备 
local monitor1 = busilib.newMonitor(TMD.CHECK_POINT, 0, {2}, {0}, {0})           --监测CC1是否有超过1600mV
local VCC1 = busilib.GetADC(ADC.CC1, 4)
local VCC2 = busilib.GetADC(ADC.CC2, 4)
baselib.report(0x00, "CC1 is " .. VCC1 .. "mV, and CC2 is " .. VCC2 .. "mV.")
if PUT_R then
    if VCC1 < 200 and VCC2 < 200 then
        baselib.report(0x00, "TD4.5.3.V.1 pass.")
    else
        baselib.report(0x00, "TD4.5.3.V.1 fail.")
    end
else
    if VCC1 < 200 then
        baselib.report(0x00, "TD4.5.3.V.1 pass.")
    else
        baselib.report(0x00, "TD4.5.3.V.1 fail.")
    end
end
-- 第五步:CVS waits max tDRP
baselib.delay(100)
-- 第六步:CVS verifies PUT has applied Rd continuously since step 4 [TD.4.5.3.V.2]
-- CVS 验证 PUT 自步骤 4 以来一直应用 Rd
if busilib.getMonitorResult(monitor1) ~= 1 then
    baselib.report(0x00, "TD.4.5.3.V.2 pass.")
else
    baselib.report(0x00, "TD.4.5.3.V.2 fail.")
end
busilib.deleteMonitor(monitor1)
-- 第七步:CVS 转换到 Disabled 状态，持续 100ms
busilib.setUsbCcs(CCS.Disabled)   
baselib.delay(100)
-- 第八步:CVS verifies PUT transitioned to Unattached.SRC within step 7 [TD.4.5.3.V.3]
-- 这里验证PUT 同时在两个 CC 引脚上应用 Rp
VCC1 = busilib.GetADC(ADC.CC1, 4)
VCC2 = busilib.GetADC(ADC.CC2, 4)
baselib.report(0x00, "CC1 is " .. VCC1 .. "mV, and CC2 is " .. VCC2 .. "mV.")
if VCC1 > 1650 and VCC2 > 200 then
    baselib.report(0x00, "TD4.5.3.V.3 pass.")
else
    baselib.report(0x00, "TD4.5.3.V.3 fail.")
end
-- 第九步:Wait 750ms.
baselib.delay(750)
-- 第十步:CVS 转换到 Unattached.SRC 状态
busilib.setUsbCcs(CCS.Unattached)
-- 第十一步:Wait 5ms
baselib.delay(5)
-- 第十二步:CVS verifies:PUT attaches Rd within max dcSRC.DRP x max tDRP [TD.4.5.3.V.4]: For a PUT_R, both CCs are terminated with Rd
-- CVS 验证：PUT 在 max dcSRC.DRP × max tDRP 内附加 Rd [TD.4.5.3.V.4]： 对于 PUT_R，两个 CC 引脚都终止为 Rd
baselib.delay(70)                           -- 等待max dcSRC.DRP(0.7) x max tDRP(100ms)
local tempVCC1 = busilib.GetADC(ADC.CC1, 4)
local tempVCC2 = busilib.GetADC(ADC.CC2, 4)
baselib.report(0x00, "CC1 is " .. tempVCC1 .. "mV, and CC2 is " .. tempVCC2 .. "mV.")
if PUT_R then
    if tempVCC1 < 200 and tempVCC2 < 200 then
        baselib.report(0x00, "TD4.5.3.V.4 pass.")
    else
        baselib.report(0x00, "TD4.5.3.V.4 fail.")
    end
else
    if tempVCC1 < 200 then
        baselib.report(0x00, "TD4.5.3.V.4 pass.")
    else
        baselib.report(0x00, "TD4.5.3.V.4 fail.")
    end
end
-- 第十三步:CVS transitions to Attached.SRC after max tCCDebounce.
-- CVS 在 max tCCDebounce 后转换到 Attached.SRC 状态
baselib.delay(200)                  -- 等待max tCCDebounce(200ms)
busilib.setUsbCcs(CCS.Attached)
-- 第十四步:CVS verifies PUT transitions to Attached.SNK
--[[14.a步:监测VBUS电流,for 500ms,电流数值可以是20ms内的平均值,判别不超过500mA(对应tester宣传的500mA供电能力),电流监控结果作为TD.4.3.2.V.2检查点进行上报。          
(原文:PUT sinks current according to CVS advertisement [TD.4.5.3.V.5]) ]]
--[[busilib.newTrans4ad(debounce,adc_channel,thresholds)功能:新建一个状态翻译器。
参数:debounce:采样并去抖次数。  adc_channel:要翻译的 ADC 通道。  thresholds:阈值列表,状态数量为阈值数量加一,长度最大为 254。
返回值:trans_id:新建的状态翻译器 ID。 ]]
local trans1 = busilib.newTrans4ad(4, ADC.CC2, {2750})
--这里对上面的trans1的状态1监控,6.d的这两行代码写前面是因为需要提前启动监控器
local monitor3 = busilib.newMonitor(TMD.CHECK_POINT, trans1, {1}, {0}, {0})
--[[busilib.waitCondition4ad(adc_channel,debonce,lower_limit,upper_limit,times,timeout) 功能:阻塞脚本,等待某条件达成。
参数:adc_channel:要监控的 ADC 通道。  debounce:采样并去抖次数。  lower_limit:目标条件值下限。  upper_limit:目标条件值上限。  times:目标需要的达成次数。  timeout:超时时间,单位为毫秒。
返回值:返回 LuaOk 表示在超时时间内达成目标条件,返回 LuaTimeout 表示超时。 ]]
if busilib.waitCondition4ad(ADC.VBUS_I, 20, 500, 5000, 1, 500) == LuaOk then
    baselib.report(0x00, "TD.4.5.3.V.5 fail.")         --出现LuaOK说明有大于500mA的电流出现了一次,检查点fail
else
    baselib.report(0x00, "TD.4.5.3.V.5 pass.")
end
-- 14.d步:检查CC2电压不超过2.75V, 将测量结果上报为TD.4.3.2.V.5    (原文:For a PUT_R, VCONN is not applied [TD.4.3.2.V.9] )
if busilib.getMonitorResult(monitor3) ~= 1 then        --出现1就是超过2750mV,否则检查点pass
    baselib.report(0x00, "TD.4.5.3.V.9 pass.")
else
    baselib.report(0x00, "TD.4.5.3.V.9 fail.")
end
--删除监控器
busilib.deleteMonitor(monitor3)
busilib.deleteTrans(trans1)
-- 第十五步:CVS transitions to Disabled
busilib.setUsbCcs(CCS.Disabled)
-- 第十六步:CVS验证PUT在tVBUSOFF过期前转换到Unattached.SNK状态      (原文:CVS verifies that PUT transitions to Unattached.SNK before tVBUSOFF expires)
baselib.delay(650)                                     --tVBUSOFF为650ms
-- 16.b:测量VBUS电压,是否小于0.8v, 将测量结果上报为TD.4.5.3.V.11    (原文:PUT stops sinking current over Vbus [TD.4.5.3.V.11]) 
local VBUS = busilib.GetADC(ADC.VBUS, 4)               --这里采样VBUS4次平均
baselib.report(0x00, "VBUS is " .. VBUS .. "mV.")
if VBUS < 0.8 then
    baselib.report(0x00, "TD.4.5.3.V.11 pass.")
else
    baselib.report(0x00, "TD.4.5.3.V.11 fail.")
end

baselib.report(0x00, "Demo is done here.")
baselib.report(0x07, "\x04")